package com.zhanghe.study.java8.stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * 测试streamApi
 * 中间操作  多个中间操作可以连接起来形成一个流水线，除非流水线触发终止操作，否则中间操作不会执行任何处理，在终止操作时一次性全部处理
 * 筛选和切片
 */
public class TestStreamApi {

    private static List<String> list = new ArrayList<>();
    static {
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("钱七");
        list.add("孙八");
        list.add("张三");
        list.add("赵六");

    }


    public static void main(String[] args) {
        System.out.println("===========testFilter==============");
        testFilter();
        System.out.println("===========testLimit==============");
        testLimit();
        System.out.println("===========testSkip==============");
        testSkip();
        System.out.println("===========testDistinct==============");
        testDistinct();
        System.out.println("===========testLimitAndSkip==============");
        testLimitAndSkip();

    }


    public static void test(){
        Stream<String> stream = Stream.generate(()->"Echo");

        Stream<String> stream1 = Stream.of("hello", "java8");

        Stream<Object> empty = Stream.empty();

        Stream<String> stream2 = Arrays.stream(new String[]{"hello", "java8"});
    }

    /**
     * filter  接收lambda，从流中排除某些元素
     */
    public static void testFilter(){
        // 中间操作
        // 使用的Predicate   boolean test(T t);
        Stream<String> stream = list.stream().filter(e ->
                {
                    System.out.println("filter中间操作");
                    return e.equals("张三");
                }
        );
        // 这时中间操作还没有执行执行
        System.out.println("----中间操作结束----");
        //终止操作：一次执行全部操作
        stream.forEach(
                System.out::println
        );
    }

    /**
     * limit 截断流，使其元素不超过给定数量
     */
    public static void testLimit(){
        list.stream().limit(2).forEach(System.out::println);
    }

    /**
     * skip 跳过元素，返回一个扔掉了前n个元素的流。若流中元素不足n个，则返回空流
     */
    public static void testSkip(){
        list.stream().skip(2).forEach(System.out::println);
    }

    public static void testLimitAndSkip(){
        System.out.println("--------先limit再skip---------");
        list.stream().limit(2).skip(1).forEach(System.out::println);
        System.out.println("--------先skip再limit---------");
        list.stream().skip(1).limit(2).forEach(System.out::println);
    }

    /**
     * distinct 筛选，通过流所生成元素的hashCode()和equals()方法去重
     */
    public static void testDistinct(){
        list.stream().distinct().forEach(System.out::println);
    }
}
